/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[LoopStatements.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package basicGrammar.flowControl;

/**
 * 循环语句
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class LoopStatements {

	public static final int TARGET_NUMBER = 10;

	/**
	 * for循环<br/>
	 * for(double x = 0; x != 10; x += 0.1)这样的循环是无限循环<br/>
	 * 
	 * @param n
	 */
	public static void forStatement(int n) {
		for (; n > TARGET_NUMBER; n--) {
			System.out.print(n + " ");
		}
		for (; n < TARGET_NUMBER; n++) {
			System.out.print(n + " ");
		}
		System.out.println(n);
	}

	/**
	 * while循环<br/>
	 * 
	 * @param n
	 */
	public static void whileStatement(int n) {
		while (n < TARGET_NUMBER) {
			System.out.print(n++ + " ");
		}
		while (n > TARGET_NUMBER) {
			System.out.print(n-- + " ");
		}
		System.out.println(n);
	}

	/**
	 * do...while循环<br/>
	 * 
	 * @param n
	 */
	public static void doWhileStatement(int n) {
		if (n > TARGET_NUMBER) {
			do {
				System.out.print(n-- + " ");
			} while (n > TARGET_NUMBER);
		} else if (n < TARGET_NUMBER) {
			do {
				System.out.print(n++ + " ");
			} while (n < TARGET_NUMBER);
		}
		System.out.println(n); // 注意这里的分号
	}

	/**
	 * forEach循环<br/>
	 * forEach循环用来遍历数组或集合类型元素<br/>
	 * forEach循环适用于实现了Iterable接口的对象或者是数组对象<br/>
	 * forEach底层使用了迭代器获取[由JVM完成], 在使用forEach循环过程中不能使用集合自身的方法对元素进行增加, 删除或修改<br/>
	 */
	public static void forEachStatement() {
		int[] array = { 1, 2, 3, 4, 5, 6 };
		for (int i : array) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

	/**
	 * Java中使用break和continue来代替C/C++中goto的作用<br/>
	 * 
	 * break语句<br/>
	 * break 单独使用, 表示跳出当前循环, 继续执行循环之后的其他语句<br/>
	 * break 配合标签使用, 表示跳到标签位置, 不再进入循环, 继续执行循环之后的其他语句<br/>
	 * continue 单独使用, 表示跳出循环起始处, 继续执行循环<br/>
	 * continue 配合标签使用时, 表示跳到标签之后, 从标签处处继续执行<br/>
	 */
	public static void breakAndContinueStatement() {
		String[] array = new String[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
		for (String num : array) {
			if ("six".equals(num)) {
				break;
			}
			if ("three".equals(num)) {
				continue;
			}
			System.out.print(num + " ");
		}
	}

	/**
	 * 死循环
	 */
	public static void deadLoop() {
		int end = Integer.MAX_VALUE;
		int begin = end - 50;
		int count = 0;
		// 问题出现在 <=
		// 当i=end时, i++超过了Integer的最大值, 再加1会得到Integer的最小值, 而其永远不可能大于end, 导致了死循环
		for (int i = begin; i <= end; i++) {
			count++;
		}

		System.out.println("本次循环次数为: " + count);
	}

	public static void main(String[] args) {
		forStatement(15);
		whileStatement(15);
		doWhileStatement(15);
		forEachStatement();
		breakAndContinueStatement();

		deadLoop();
	}
}
